package com.xjk.date;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Date;


/**
 * @author 许嘉凯
 * @Description: 时间工具类
 */
public class DateTimeUtils {

  /**
   * 时间格式：yyyy-MM-dd HH:mm:ss。
   */
  public static final String THE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";

  /**
   * 时间格式：yyyyMMddHHmmss。
   */
  public static final String OTHER_TIME_FORMAT = "yyyyMMddHHmmss";

  /**
   * 时间格式：yyyyMM。
   */
  public static final String YEAR_MONTH_TIME_FORMAT = "yyyyMM";

  /**
   * 时间格式：yyyyMMdd。
   */
  public static final String YEAR_MONTH_DAY_TIME_FORMAT = "yyyyMMdd";

  /**
   * 时间格式：yyyy-MM-dd。
   */
  public static final String YEAR_MONTH_DAY_FORMAT = "yyyy-MM-dd";

  /**
   * 时间格式：yy-MM-dd。
   */
  public static final String YEAR_MONTH_DAY_FORMAT1 = "yy-MM-dd";

  /**
   * 时间格式：yyyy/MM/dd。
   */
  public static final String YEAR_MONTH_DAY_FORMAT2 = "yyyy/MM/dd";

  /**
   * 时间格式：yyyy年MM月
   */
  public static final String YEAR_MONTH_FORMAT1 = "yyyy年MM月";


  /**
   * Date转LocalDateTime
   *
   * @param date
   * @return
   */
  public static LocalDateTime dateToLocalDateTime(Date date) {
    return date.toInstant()
        .atZone(ZoneId.systemDefault())
        .toLocalDateTime();
  }

  /**
   * LocalDateTime转Date
   *
   * @param localDateTime
   * @return
   */
  public static Date localDateTimeToDate(LocalDateTime localDateTime) {
    return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
  }

  /**
   * Date转LocalDate
   *
   * @param date
   * @return
   */
  public static LocalDate dateToLocalDate(Date date) {
    return date.toInstant()
        .atZone(ZoneId.systemDefault())
        .toLocalDate();
  }

  /**
   * LocalDate转Date
   *
   * @param localDate
   * @return
   */
  public static Date localDateToDate(LocalDate localDate) {
    return Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
  }

  /**
   * Date转LocalTime
   *
   * @param date
   * @return
   */
  public static LocalTime dateToLocalTime(Date date) {
    return date.toInstant()
        .atZone(ZoneId.systemDefault())
        .toLocalTime();
  }

  /**
   * LocalTime转Date
   *
   * @param localTime
   * @return
   */
  public static Date localTimeToDate(LocalTime localTime) {
    LocalDate today = LocalDate.now();
    Instant instant = localTime.atDate(today)
        .atZone(ZoneId.systemDefault())
        .toInstant();
    return Date.from(instant);
  }

  /**
   * LocalDate转LocalDateTime
   * @param localDate
   * @return
   */
  public static LocalDateTime localDateToLocalDateTime(LocalDate localDate) {
    return localDate.atStartOfDay();
  }

  /**
   * LocalDateTime转LocalDate
   * @param localDateTime
   * @return
   */
  public static LocalDate localDateTimeToLocalDate(LocalDateTime localDateTime) {
    return localDateTime.toLocalDate();
  }

  /**
   * LocalDate转LocalTime
   * @param localTime
   * @return
   */
  public static LocalDateTime localTimeToLocalDateTime(LocalTime localTime) {
    return LocalDateTime.of(LocalDate.now(), localTime);
  }

  /**
   * LocalTime转LocalDateTime
   * @param localDateTime
   * @return
   */
  public static LocalTime localDateTimeToLocalTime(LocalDateTime localDateTime) {
    return localDateTime.toLocalTime();
  }

  /**
   * String转Date
   * @param strDate
   * @param format
   * @return
   */
  public static Date stringToDate(String strDate, String format) {
    DateFormat dateFormat = new SimpleDateFormat(format);
    try {
      return dateFormat.parse(strDate);
    } catch (ParseException e) {
      e.printStackTrace();
    }
    return null;
  }

  /**
   * Date转String
   * @param date
   * @param format
   * @return
   */
  public static String dateToString(Date date, String format) {
    DateFormat dateFormat = new SimpleDateFormat(format);
    return dateFormat.format(date);
  }

  /**
   * String转LocalDate
   * @param strDate
   * @param format
   * @return
   */
  public static LocalDate stringToLocalDate(String strDate, String format) {
    return LocalDate.parse(strDate, DateTimeFormatter.ofPattern(format));
  }


}